package system

import (
	"errors"
	"mytest/models"

	"gorm.io/gorm/clause"

	"gorm.io/gorm"
)

//添加一个角色，
//只需要填写 三个字段：id ，name ，父亲
func CreateAuthority(db *gorm.DB, auth models.SysAuthority) (error, models.SysAuthority) {
	var authaa models.SysAuthority
	if !errors.Is(db.Where("authority_id=?", auth.AuthorityId).First(&authaa).Error,
		gorm.ErrRecordNotFound) {
		return errors.New("存在相同角色id"), auth
	}
	err := db.Create(&auth).Error
	return err, auth
}

//删除角色
func DeleteAuthority(db *gorm.DB, authId string) error {
	//查找用户有没有人
	var user models.SysUser
	if !errors.Is(db.Model(&models.SysUser{}).Where("authority_id=?", authId).First(&user).Error,
		gorm.ErrRecordNotFound) {
		return errors.New("存在用户使用")
	}
	//查找儿子
	var son models.SysAuthority
	if !errors.Is(db.Model(&models.SysAuthority{}).Where("parent_id=?", authId).First(&son).Error,
		gorm.ErrRecordNotFound) {
		return errors.New("存在儿子角色id")
	}

	//删除菜单关联,得先查找出关联
	tmp := models.SysAuthority{AuthorityId: authId}
	db.Preload(clause.Associations).First(&tmp)

	err := db.Model(&tmp).Association("SysBaseMenus").Delete(&tmp.SysBaseMenus)
	if err != nil {
		return err
	}
	//del self
	return db.Delete(&tmp).Error
}

//设置角色的菜单， 这个菜单 是标准的， 因为前端已经获取到了完整的菜单，再传入 平行的菜单，设置关联
func SetAuthorityMenus(db *gorm.DB, authId string, menus []models.SysBaseMenu) error {
	var auth models.SysAuthority
	//替换关联，为了替换SysBaseMenus，需要preload
	err := db.Where("authority_id=?", authId).First(&auth).Error
	if err != nil {
		return err
	}
	e := db.Model(&auth).Association("SysBaseMenus").Replace(&menus)
	return e
}

//获取所有角色信息，树形结构
func GetAllAuthority(db *gorm.DB) (err error, res []models.SysAuthority) {
	var allAuth []models.SysAuthority
	err = db.Model(&models.SysAuthority{}).Find(&allAuth).Error
	if err != nil {
		return err, nil
	}
	authTreeMap := make(map[string][]models.SysAuthority)
	for _, v := range allAuth {
		authTreeMap[v.ParentId] = append(authTreeMap[v.ParentId], v)
	}
	res = authTreeMap["0"]
	for i := range res {
		pushAuthChild(&res[i], authTreeMap)
	}
	return err, res
}
func pushAuthChild(auth *models.SysAuthority, treeMap map[string][]models.SysAuthority) {
	auth.Children = treeMap[auth.AuthorityId]
	for i := range auth.Children {
		pushAuthChild(&auth.Children[i], treeMap)
	}
}

//获取所有角色信息，平行结构
func GetAllAuthorityFlat(db *gorm.DB) (error, []models.SysAuthority) {
	var allAuth []models.SysAuthority
	err := db.Model(&models.SysAuthority{}).Find(&allAuth).Error
	if err != nil {
		return err, nil
	}
	return err, allAuth
}

//更新一个角色，更新父亲id，name
func UpdateAuth(db *gorm.DB, auth *models.SysAuthority) error {
	return db.Updates(&auth).Error
}
